package week6.hotel;

import week6.ui.*;
import java.io.*;
import java.util.*;

/**
 * 
 * Practicumopgave Programmeren 1
 * @author Rick Clement en Adriaan Dekker
 * @version $Revision: 1.3 $
 */
public class Rekening {
	// ------------------ Main methode ----------------

	/**
	 * run de klasse in command-prompt
	 */
	public static void main(String[] args) {
		PrintStream out = System.out;
		Rekening rekening = new Rekening(out);
		rekening.testprint(out);
		rekening.sluitAf();
	}
	
	public void testprint(PrintStream out) {
		this.out = out;
		this.out.println("test! :D");
	}
	
    // ------------------ Instantievariabelen ----------------

	private PrintStream out;
	private List<Item> items;
   
    // ------------------ Constructor ------------------------

    /**
     * Construeert een rekening, die de uitvoer naar een gegeven PrintStream stuurt.
     * @param out uitvoer waar de rekening geprint wordt; of null als er geen uitvoer geprint dient te worden.
	 * @ensure getTotaal() == 0
     */
		
	public Rekening(PrintStream out) {
		this.out = out;
		this.items = new ArrayList<Item>();
	}
	
    // ------------------ Aanvragen --------------------------

    /**
     * Levert het totaalbedrag van deze rekening op. //Wat een kutcommentaar eigenlijk.
	 * @ensure result >= 0
     */
	
	public double getTotaal() {	
		double totaal = 0;
		for (int i = 0; i < items.size(); i++) {
			totaal += items.get(i).getBedrag();	
		}
		return totaal;
	}
	
    // ------------------ Commando's --------------------------

    /**
     * Voegt een item toe aan de rekening. Het item wordt op de uitvoer geprint (mits deze ingesteld is), en het bedrag wordt aan het totaal van deze rekening toegevoegd. 
     * @param item het nieuw toe te voegen item
	 * @require item != null
	 * @ensure this.getTotaal() == old.getTotaal() + item.getBedrag()
     */
	public void nieuwItem(Rekening.Item item) {
		items.add(item);
	}
	 
	/**
     * Print het totaalbedrag van de rekening op de uitvoer, mits deze ingesteld is. 
     */
	 
	public void sluitAf() {
		if (out != null) {
			out.println("Uw rekening:");
			for (int i = 0; i < items.size(); i++) {
				Item item = items.get(i);
				String rekening = Format.printRekeningItem(item, false);
				out.println(rekening);
			}
			String rekening = Format.printRekeningItem("Totaal", getTotaal(), false);
			out.println(rekening);
		}
	}
	
	// ------------------ Geneste klassen --------------------------
	
	/**
	 * Abstractie voor een item op een rekening. Een item wordt gekenmerkt door bedrag en beschrijving; de beschrijving wordt verkregen via toString() 
	 */
	public static interface Item {
	
		// ------------------ Aanvragen --------------------------
		
		/**
		 * Levert het bedrag van dit item op.
		 * @ensure result >= 0
		 */
		double getBedrag();
		
		/**
		 * Levert een passende beschrijving als representatie van dit item op de rekening
		 */
		String getBeschrijving();
	}
}


